# PyX_Demo_NumPy_Simple-Example_GF_2023-07-06.py

# Create By GF 2023-07-06 20:15

# ----------------------------------------------------------------------------------------------------

import numpy as np

# ----------------------------------------------------------------------------------------------------
# numpy.array()：

# numpy.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0, like=None)

# 通过复制引用对象的数据创建数组。

# 参数说明：
# object ：接受array_like，任何接受数组接口的对象，或任何（嵌套）序列无默认值。
# dtype  ：表示数组所需的数据类型。如果没有给出，那么类型将被确定为在序列中保存对象所需的最小类型。
# copy   ：默认为True，复制对象。
# order  ：指定数组的内存布局。可选：{‘K’, ‘A’, ‘C’, ‘F’}，默认：‘C’。
# subok  ：如果为 True，则子类将被传递，否则返回的数组将被强制为基类数组（默认）。
# ndmin  ：指定结果数组应具有的最小维数
# like   ：引用对象以允许创建不是 NumPy 数组的数组。

# 返回值：
# ndarray

# ----------------------------------------------------------------------------------------------------
# 使用 numpy.array() 创建数组。

arr = np.array([[1.,7.,0.],[-2.,1.,2.]])

#>>> arr
#[[ 1.  7.  0.]
# [-2.  1.  2.]]

# ----------------------------------------------------------------------------------------------------
# numpy.asarray()：

# numpy.asarray(a, dtype=None, order=None, *, like=None)

# 将输入转换为数组。

# 参数说明：
# a     ：可以转换为数组的任何形式的输入数据。这包括列表、元组列表、元组、元组的元组、列表的元组和 ndarray。
# dtype ：数据类型，可选。默认情况下，数据类型是从输入数据中推断出来的。
# order ：指定数组的内存布局。可选：{‘K’, ‘A’, ‘C’, ‘F’}，默认：‘C’。
# like  ：引用对象以允许创建不是 NumPy 数组的数组。

# 返回值：
# ndarray

# ----------------------------------------------------------------------------------------------------
# 使用 numpy.asarray() 将输入转换为数组(dtype相同时，创建引用数组)。

arr01 = np.array([1,2,3,4], dtype=np.float32)

# 直接引用 arr01 的数据，不复制。
arr02 = np.asarray(arr01)

# 当数据类型 dtype 相同时直接引用数据。
arr02 = np.asarray(arr01, dtype=np.float32)

#>>> arr01
#array([1., 2., 3., 4.], dtype=float32)
#>>> arr02
#array([1., 2., 3., 4.], dtype=float32)
#>>> arr02 is arr01
#True

# 当数据类型 dtype 不相同时复制数据。
arr03 = np.asarray(arr01, dtype=np.float16)

#>>> arr01
#array([1., 2., 3., 4.], dtype=float32)
#>>> arr03
#array([1., 2., 3., 4.], dtype=float16)
#>>> arr03 is arr01
#False

# ----------------------------------------------------------------------------------------------------
# numpy.arange()：

# numpy.arange([start, ]stop, [step, ]dtype=None, *, like=None)

# 在给定的范围内返回均匀间隔的值的数组。

# 参数说明：
# start ：开始值，接收整数或实数，默认开始值为0。
# stop  ：结束值（不包括结束值），接收整数或实数，无默认值。
# step  ：步长，值之间的间隔，接收整数或实数，默认为1。
# dtype ：数据类型，无默认，如果dtype未给出，则从其他输入参数推断数据类型。
# like  ：引用对象以允许创建不是 NumPy 数组的数组。

# 返回值：
# ndarray

# ----------------------------------------------------------------------------------------------------
# 使用 numpy.arange() 创建给定的范围内的均匀间隔的序列数组。

range_arr = np.arange(3, 7)

#>>> range_arr
#array([3, 4, 5, 6])

# ----------------------------------------------------------------------------------------------------
# numpy.linspace()：

# numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)

# 返回等差数列数组。

# 参数说明：
# start    ：接收array_like，序列的开始值。
# stop     ：接收array_like，序列的结束值。
# num      ：接收int（必须为非负数），生成的样本数量，默认值为50。
# endpoint ：接受布尔值，如果为True，则包含结束值，否则不包括结束值。默认为真。
# retstep  ：接收布尔值，如果为 True，则返回 ( samples , step)，其中step是样本之间的间距。默认为False。
# dtype    ：输出数组的类型。
# axis     ：接收int。结果中用于存储样本的轴。

# 返回值：
# ndarray
# step：当retstep为Trur时返回。样本之间的间距大小。

# ----------------------------------------------------------------------------------------------------
# 使用 numpy.linspace() 创建等差数列数组。

linspace_arr01 = np.linspace(2.0, 3.0, num=5)
#>>> linspace_arr01
#array([2.  , 2.25, 2.5 , 2.75, 3.  ])

linspace_arr02 = np.linspace(2.0, 3.0, num=5, endpoint=False)
#>>> linspace_arr02
#array([2. , 2.2, 2.4, 2.6, 2.8])

linspace_arr03 = np.linspace(2.0, 3.0, num=5, retstep=True)
#>>> linspace_arr03
#(array([2.  , 2.25, 2.5 , 2.75, 3.  ]), 0.25)

# ----------------------------------------------------------------------------------------------------
# numpy.logspace()：

# numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0)

# 返回等比数列数组。

# 参数说明：
# start    ：接收array_like，序列的开始值。
# stop     ：接收array_like，序列的结束值。
# num      ：接收int（必须为非负数），生成的样本数量，默认值为50。
# endpoint ：接受布尔值，如果为True，则包含结束值，否则不包括结束值。默认为真。
# base     ：对数的底数，默认值为 10.0。
# dtype    ：输出数组的类型。
# axis     ：接收int。结果中用于存储样本的轴。

# 返回值：
# ndarray

# ----------------------------------------------------------------------------------------------------
# 使用 numpy.logspace() 创建等比数列数组。

logspace_arr01 = np.logspace(2.0, 3.0, num=4)
#>>> logspace_arr01
#array([ 100.        ,  215.443469  ,  464.15888336, 1000.        ])

logspace_arr02 = np.logspace(2.0, 3.0, num=4, endpoint=False)
#>>> logspace_arr02
#array([100.        , 177.827941  , 316.22776602, 562.34132519])

logspace_arr03 = np.logspace(2.0, 3.0, num=4, base=2.0)
#>>> logspace_arr03
#array([4.        , 5.0396842 , 6.34960421, 8.        ])

# ----------------------------------------------------------------------------------------------------
# ndarray 的主要属性：

# ndarry.ndim (返回数组维数)。
#>>> arr.ndim
#2

# naarray.shape (返回数组行数和列数)。
#>>> arr.shape
#(2,3)

# ndarry.size (返回数组元素总数)。
#>>> arr.size
#6

# ndarray.dtype (返回数组元素的类型)。
#>>> arr.dtype
#dtype('float64')

# ndarray.itemsize (返回数组中每个元素占有字节的大小)。
#>>> arr.itemsize
#8

# ndarray.date (返回数组元素的数据缓冲区)。
#>>> arr.data
#<memory at 0x0000029432BC8D40>

# ----------------------------------------------------------------------------------------------------
# 使用 numpy.zeros() 创建全是0的特殊数组。

zero_arr = np.zeros((3, 4), dtype='float64')

#>>> zero_arr
#array([[0., 0., 0., 0.],
#       [0., 0., 0., 0.],
#       [0., 0., 0., 0.]])

# ----------------------------------------------------------------------------------------------------
# 使用 numpy.ones() 创建全是1的特殊数组。

one_arr = np.ones((4, 4), dtype='int64')

#>>> one_arr
#array([[1, 1, 1, 1],
#       [1, 1, 1, 1],
#       [1, 1, 1, 1],
#       [1, 1, 1, 1]], dtype=int64)

# ----------------------------------------------------------------------------------------------------
# 使用 numpy.empty() 创建空数组(特殊数组)。

##empty数组
empty_arr = np.empty((5, 5), dtype=np.float64)

#>>> empty_arr
#array([[2.78149850e-307, 7.56603882e-307, 9.34605037e-307,
#        3.56043054e-307, 1.37961641e-306],
#       [8.34424342e-308, 6.23036978e-307, 6.23053954e-307,
#        9.34609790e-307, 8.45593934e-307],
#       [9.34600963e-307, 1.86921143e-306, 6.23061763e-307,
#        8.90104239e-307, 6.89804132e-307],
#       [1.22387805e-307, 1.42418172e-306, 2.04712906e-306,
#        7.56589622e-307, 1.11258277e-307],
#       [8.90111708e-307, 2.11389826e-307, 1.11260619e-306,
#        5.42909724e-096, 5.42909779e-096]])

# 默认输出是浮点数，可以更改输出数据类型。
# 为什么输出的不是一整个空数组呢？
# empty, unlike zeros, does not set the array values to zero, and may therefore be marginally faster. On the other hand, it requires the user to manually set all the values in the array, and should be used with caution.

# 为了运行更快，尽管他看上去不是一个空数组但是本质还是一个空数组，直接再拿一个需要的数组赋值进去就行。

sample_empty_arr = np.empty([5, 4], int)

np.random.seed(0)

sample_empty_arr = np.random.randint(0, 20, (5, 4))

#>>>sample_empty_arr
#array([[10,  3, 11, 18],
#       [ 2,  0,  0,  4],
#       [ 5,  6,  8, 17],
#       [15,  4,  9, 10],
#       [ 1,  1,  7,  9]])

# ----------------------------------------------------------------------------------------------------
# ndarray 数组运算。

# ndarray 数组可以进行加、减、乘、除、乘方等运算。

# ----------------------------------------------------------------------------------------------------
# ndarray 数组拷贝。

# ndarray 数组可以进行加、减、乘、除、乘方等运算。

arr01 = np.array([1, 2, 3, 4, 5])

arr02 = arr01

#>>> id(arr01)
#2835530804080
#>>> id(arr02)
#2835530804080

# 通过 .copy() 方法进行深拷贝。
arr02 = arr01.copy()

#>>> id(arr01)
#2835530804080
#>>> id(arr02)
#2835742018320

# ----------------------------------------------------------------------------------------------------
# 使用 numpy.matrix() 函数创建矩阵。

# 矩阵和数组的不同在于矩阵遵循数学运算规律。

# 三种创建矩阵的方式
M = np.mat('1,2,3;4,5,6;7,8,9')
A = np.matrix('1.0 2.0; 3.0 4.0')
B = np.matrix([[1.0,2.0],[3.0,4.0]])

#>>> M
#matrix([[1, 2, 3],
#        [4, 5, 6],
#        [7, 8, 9]])
#>>> A
#matrix([[1., 2.],
#        [3., 4.]])
#>>> B
#matrix([[1., 2.],
#        [3., 4.]])

# 矩阵的转置。
#>>> A.T
#matrix([[1., 3.],
#        [2., 4.]])

# 矩阵的乘法。
#>>> A*B
#matrix([[ 7., 10.],
#        [15., 22.]])

# 矩阵的逆。
#>>> A.I
#matrix([[-2. ,  1. ],
#        [ 1.5, -0.5]])

# ----------------------------------------------------------------------------------------------------
# EOF
